ISNULL与“IS NULL和字段= 0” |
您所在的位置:网站首页 › sqlserver isnull用法 › ISNULL与“IS NULL和字段= 0” |
如果Apps.mfrId为null,那么您将加入每个制造商。 从您的测试, “OR ISNULL(apps.mfrId,0)= 0” 确实比这个更便宜的 “OR Apps.mfrId为空或Apps.mfrId = 0” 这些做似乎很等价的,你已经有了一个解决方案,所以问题是为什么和/或如何让非表演者工作。 说到这样的表现,如果你说的一切都是正确的,当我们开始问为什么时,我们开始指向查询优化器。如果它对于相同的参数表现不同,它将有不同的查询计划。您可能会看到表扫描而不是索引使用情况,或者对性能不佳的其他解释。 我鼓励你比较一下查询计划,或者让别人来帮助引入一个关于它在做什么不同的答案。但是,你已经可以告诉它正在做一些不同的事情。 一种可能性是,当查询优化器修复被释放,他们在默认情况下不开启,除非标志4199(所有修正或其他标志的具体修正)被开启。这是因为一般修补程序对于大多数人来说可能是好的,但是也可能会破坏在现有的怪癖环境中进行了优化的应用程序。 https://dba.stackexchange.com/questions/102292/trace-flag-4199-enable-globally 是否在帮助开启4199? select top 2000 Apps.object_id from Manufacturer INNER JOIN Apps ON ( Apps.mfrId = Manufacturer.Id OR Apps.mfrId IS NULL OR Apps.mfrId = 0 ) where Apps.OBJECT_ID = 6879149 OPTION(QUERYTRACEON 4199)另一个相关的议题是参数嗅探。有时候查询计划可能会被缓存,这对于一个参数是最佳的,但是对于另一个参数是可怕的。在你的情况下,一个应用程序可能会返回1个制造商,但另一个应用程序可能会返回所有制造商,这就是值得一提的原因。这通常显示为相同的代码在给定不同参数时不一致地执行不良。 您可以尝试关闭参数嗅探或强制重新编译以帮助诊断问题是否成为问题的一部分。 What are the main differences between OPTION(OPTIMIZE FOR UNKNOWN) and OPTION(RECOMPILE)? 我曾经见过,如果觉得查询优化器的情况下已经放弃细读指标,只是因为该语句变得过于复杂。但在你的例子中这似乎不太可能;除了查询优化器错误的问题得到解决之外,要利用它们,您仍然必须打开查询标记,否则您安装的补丁可能无法做任何事情。 有时您还可以尝试帮助指导sql优化器。如果应该总是使用一个索引,那么可以将其作为查询提示给出。 我也很好奇知道,如果以下删除问题:如果所有的查询优化器修复被打开 select top 2000 Apps.object_id from ( select Apps.object_id, Apps.mfrId from Apps where Apps.OBJECT_ID = 6879149 ) Apps left join Manufacturer ON ( Apps.mfrId = Manufacturer.Id OR Apps.mfrId IS NULL OR Apps.mfrId = 0),问题仍然存在,我们要问,为什么查询优化器做这个。它只能使用存在的索引,并且只有在存在统计信息的情况下才能确定使用索引是否有利。同时,过时的统计数据将导致不好的选择。定期重建/重组索引并更新统计信息可能会很好。你可能想尝试这样做,看看它是否有任何影响。 结论 既然你已经有了一个固定的工作,不要使用它。但是你的问题是为什么两个非常相似的事情会达到非常不同的结果。假设正在使用相同的参数,并且包括两个选项非常相似的事实,则问题指向查询优化器是一个不好的选择。这表明您可能需要安装最新的修补程序(如果未安装),并且还启用4199以实际启用您已通过sql server修补程序安装的所有查询优化程序修补程序。这包括将OPTION(QUERYTRACEON 4199)添加到sql的底部,或者在全局启用4199或类似的。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |